하드 링크
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
하드 링크는 동일한 물리적 데이터를 가리키는 여러 개의 파일 이름을 생성하는 파일 시스템 기능이다. 하드 링크를 사용하면 파일을 수정할 때 모든 링크에서 변경 사항이 반영되며, 마지막 링크를 제외한 어떤 링크를 삭제해도 파일은 유지된다. 파일 시스템은 참조 횟수를 사용하여 하드 링크를 관리하며, 참조 횟수가 0이 되면 파일이 차지했던 디스크 공간을 해제한다. 하드 링크는 유닉스 계열, POSIX 호환 및 부분 호환 운영 체제에서 `link()` 시스템 호출 또는 `ln` 명령어를 통해 생성할 수 있으며, 윈도우에서는 `mklink /H` 또는 `fsutil.exe hardlink create` 명령어를 사용한다. 하지만 하드 링크는 동일한 볼륨 내의 파일에만 생성 가능하며, 디렉토리에 대한 하드 링크는 제한된다.
더 읽어볼만한 페이지
하드 링크 | |
---|---|
일반 정보 | |
종류 | 디렉터리 항목 |
연결 대상 | 파일 |
특징 | 동일한 inode 번호를 가짐 원본 파일과 완전히 동일하게 동작 파일 시스템 내에서만 가능 디렉터리 간 연결 불가 삭제 시 데이터는 유지 (다른 하드 링크가 존재할 경우) |
기술적 세부 사항 | |
동작 원리 | 파일 시스템 내에서 파일의 inode 번호를 공유하는 방식 |
삭제 동작 | 하드 링크 중 하나를 삭제해도 다른 링크와 원본 파일은 유지됨 (inode 참조 횟수가 감소) |
생성 방법 (유닉스 계열) | ln 명령 사용 (예: ln 원본_파일 하드_링크_이름) |
생성 방법 (윈도우) | mklink /H 명령 또는 Link Shell Extension 사용 |
지원 파일 시스템 | NTFS (윈도우) ReFS (윈도우) ext4 (리눅스) 기타 대부분의 유닉스 계열 파일 시스템 |
장단점 | |
장점 | 공간 효율성 (데이터 중복 저장 방지) 빠른 접근 속도 (별도 경로 탐색 불필요) 원본 파일 보호 (링크 삭제 시 원본 유지) |
단점 | 파일 시스템 간 링크 불가 디렉터리 링크 불가 원본 파일 삭제 시 모든 링크 접근 불가 |
소프트 링크 (심볼릭 링크)와의 비교 | |
소프트 링크 | 다른 파일 시스템 또는 디렉터리로 연결 가능 원본 파일 삭제 시 링크 깨짐 별도의 inode 번호를 가짐 일종의 바로가기 역할 |
하드 링크 | 동일 파일 시스템 내에서만 가능 원본 파일 삭제 시에도 다른 링크는 유효 (inode 참조 횟수가 0이 되기 전까지) 원본 파일과 동일한 inode 번호를 가짐 원본 파일과 완전히 동일하게 동작 |
활용 예시 | |
백업 | 동일한 파일의 여러 버전을 효율적으로 관리 |
파일 공유 | 여러 위치에서 동일한 파일에 접근 |
공간 절약 | 중복된 파일 저장 없이 공간 활용 |
주의 사항 | |
디렉터리 | 대부분의 시스템에서 디렉터리에 대한 하드 링크는 제한됨 (보통 슈퍼유저만 가능) |
파일 시스템 호환성 | 하드 링크는 파일 시스템에 종속적이므로, 다른 파일 시스템으로 복사 시 유실될 수 있음 |
2. 작동 원리
하드 링크는 파일 시스템의 i-node를 이용하여 구현된다. 아이노드는 파일의 메타데이터를 저장하는 자료 구조로, 파일 이름이 아닌 아이노드 번호를 통해 파일에 접근한다.
"LINK A.TXT"와 "LINK B.TXT"라는 두 개의 하드 링크가 동일한 물리적 데이터를 가리킨다고 가정할 때, 텍스트 편집기로 "LINK A.TXT"를 수정 후 저장하면 "LINK B.TXT"에서도 동일한 변경 사항을 확인할 수 있다. 이는 두 파일 이름이 동일한 데이터를 가리키기 때문이다. 사용자 관점에서는 여러 파일 이름을 가진 하나의 파일처럼 작동하며, 마지막 파일 이름을 제외한 다른 파일 이름을 삭제해도 파일은 유지된다.
하지만 GNU Emacs와 같은 일부 편집기는 하드 링크를 깨뜨리기도 한다. 예를 들어 "LINK B.TXT"를 열면, emacs는 "LINK B.TXT"의 이름을 "LINK B.TXT~"로 바꾸고, 이를 편집기에 로드한 다음, 수정된 내용을 새로 생성된 "LINK B.TXT"에 저장한다. 이 경우 "LINK A.TXT"와 "LINK B.TXT"는 더 이상 동일한 데이터를 공유하지 않는다. (emacs 변수 `backup-by-copying`을 사용하여 변경 가능)
물리적 데이터에 대한 하드 링크는 얼마든지 생성할 수 있으며, 사용자는 기존 링크의 이름을 지정하여 데이터에 접근할 수 있다. 운영 체제는 실제 데이터의 위치를 확인하며, 하드 링크 중 하나를 삭제해도 데이터는 남아 있는 다른 링크를 통해 접근할 수 있다. 모든 링크가 삭제되고 어떤 프로세스도 파일을 열어두지 않은 경우에만 운영 체제는 파일이 차지했던 디스크 공간을 해제한다.
파일은 적어도 하나의 하드 링크를 가지며, 여러 개의 하드 링크를 가질 수도 있다. 이 경우, 해당 파일은 여러 개의 다른 이름으로 접근할 수 있다[17]。UNIX에서 모든 파일과 디렉토리는 아이노드라는 고유한 ID를 가지며, 하드 링크는 같은 ID(아이노드)에 접근하는 파일을 의미한다. 따라서 새 하드 링크를 생성하면 같은 데이터(그림의 Actual Data on Disk)에 접근하는 방법이 여러 개가 된다[16]。어느 쪽에서 변경하더라도 대상이 되는 실체와 아이노드는 동일하므로, 겉으로 보기에는 모든 파일에 변경 사항이 반영된다. 이는 소프트 링크와 유사하지만, 소프트 링크는 원본의 이름이 바뀌거나 이동하면 링크가 무효가 되는 반면, 하드 링크는 원본의 이름 변경이나 이동에 영향을 받지 않는다.
소프트 링크는 이름과 파일 접근 방법을 연결하는 반면, 하드 링크는 이름을 파일의 실체에 직접 연결한다. 따라서 어떤 이름에서 하드 링크를 따라가도 파일의 실체에 대한 접근은 동일하게 처리된다. 파일 시스템에서 파일을 삭제한다는 것은 하드 링크를 삭제한다는 의미로 사용된다.
하드 링크는 파일 시스템 기능에 의존하므로, 다른 볼륨 간 링크 생성은 불가능하다[17]。
파일에 별명을 붙이는 기능으로서 하드 링크는 주로 소프트 링크가 없던 UNIX 시절에 사용되었다. 최근에는 NTFS나 HFS+에도 구현되어 여러 운영 체제에서 사용되지만, 파일에 별명을 붙일 때는 볼륨 간 링크가 가능하고 관리가 쉬운 소프트 링크를 사용하는 경우가 많다.
UNIX에서는 각 디렉토리가 3종류의 하드 링크로 참조된다. tmp 디렉토리를 예로 들면 다음과 같다.
- 부모 디렉토리에서 해당 디렉토리를 참조하는 "tmp"라는 이름
- 해당 디렉토리에서 자신을 참조하는 "."라는 이름
- 자식 디렉토리에서 해당 디렉토리를 참조하는 ".."라는 이름
하드 링크 ".."는 해당 디렉토리의 자식 디렉토리 수와 같다.
Windows에서는 Windows NT 3.1부터 파일에 대한 하드 링크를 지원한다. Windows XP 이후에는 명령 프롬프트에서
fsutil hardlink create "새로 만들어질 파일의 경로" "원본 데이터가 될 파일의 경로"
를 입력하여 하드 링크를 생성할 수 있다.
여러 개의 하드 링크를 가진 파일을 프로그램으로 열고 있을 때, 하드 링크에 대한 파일 조작은 잠긴다. 즉, 디렉토리 A와 B에 하드 링크된 파일 X를 열고 있는 동안에는, 디렉토리 A에서 열었더라도 디렉토리 B에 있는 파일 X를 삭제하거나 이름을 변경할 수 없다.
2. 1. 참조 횟수
하드 링크를 지원하는 대부분의 파일 시스템은 참조 횟수를 사용한다. 시스템은 각 논리적 데이터 섹션과 함께 해당 데이터에 연결된 하드 링크의 총 개수를 나타내는 정수 값을 저장한다. 새 링크가 생성되면 이 값은 1씩 증가하고, 링크가 제거되면 1씩 감소한다. 카운터가 0이 되면 운영 체제는 논리적 데이터 섹션을 해제한다.[17]
POSIX를 준수하는 운영 체제에서 파일 또는 디렉터리의 참조 횟수는 stat() 또는 fstat() 시스템 호출에 의해 `struct stat`의 `st_nlink` 필드에 반환된다.
3. 사용
유닉스 계열 운영 체제와 POSIX 호환 및 부분 호환 운영 체제에서는 시스템 호출을 사용하거나 ln과 link 명령 줄 유틸리티를 사용하여 기존 파일에 대한 추가적인 하드 링크를 만들 수 있다.[22] stat 명령어는 파일이 가리키는 하드 링크의 개수를 알려주며, 이 정보는 `ls -l` 명령의 출력에도 포함된다.
마이크로소프트 윈도우에서는 윈도우 NT 이후 운영 체제(예: 윈도우 비스타)에서 `mklink /H` 명령어를, 초기 운영 체제 (윈도우 XP, 윈도우 서버 2003)에서 `fsutil.exe hardlink create` 명령어를 사용하여 하드 링크를 만들 수 있다.[20]
윈도우 2000 이상의 윈도우 API에는 하드 링크 생성을 위한 `CreateHardLink()` 호출, 제거를 위한 `DeleteFile()`, 연결된 하드 링크 수를 확인하는 `GetFileInformationByHandle()`이 포함된다.[21] 하드 링크를 사용하려면 NTFS 파티션이 필요하다. 윈도우 비스타부터는 하드 링크를 사용하여 하드 디스크 드라이브에 저장된 각기 다른 버전의 DLL을 추적하기 위해 윈도우 컴포넌트 스토어(WinSxS)를 사용한다. 시그윈과 같은 유닉스 계열 에뮬레이션 또는 호환성 소프트웨어를 사용하면 윈도우에서 POSIX 인터페이스를 사용할 수 있다.
링크 해제(unlinking)는 볼륨 상의 데이터와 이름 간의 연결을 끊는 과정이다. 데이터는 하나 이상의 링크가 존재하는 한 계속 접근할 수 있으며, 마지막 링크가 제거되면 해당 공간은 해제된 것으로 간주된다.
4. 제한 사항
운영 체제는 일반적으로 파일 시스템의 순환을 방지하고, `..` 파일(상위 디렉토리)의 해석을 일관되게 유지하기 위해 디렉토리에 대한 하드 링크를 허용하지 않는다.[4] UNIX System V는 이를 허용했지만, 슈퍼유저만 이러한 링크를 만들 수 있는 권한을 가졌다.[4] Mac OS X v10.5 (Leopard) 이상 버전은 Time Machine 백업 메커니즘에만 디렉토리에 하드 링크를 사용한다.[5]
하드 링크는 동일한 볼륨, 즉 동일한 파일 시스템 내의 파일에만 생성할 수 있다.[17] 단일 파일에 대한 하드 링크의 최대 수는 참조 카운터의 크기에 의해 제한된다. 유닉스 계열 시스템에서 카운터는 4,294,967,295(32비트 시스템) 또는 18,446,744,073,709,551,615(64비트 시스템)이다. 일부 파일 시스템에서는 하드 링크의 수가 디스크 내 형식에 의해 더 엄격하게 제한된다. 예를 들어, Linux 3.11 기준으로 ext4 파일 시스템은 파일당 하드 링크 수를 65,000개로 제한한다.[6] Windows는 NTFS 볼륨에서 파일당 1024개의 하드 링크로 제한을 시행한다.[7]
Linux Weekly News에서 닐 브라운(Neil Brown)은 하드 링크가 보존 관리가 많이 필요하다고 비판했는데, 이는 아카이버(archivers) 및 디스크 사용 도구 등 디렉토리 트리를 처리하는 프로그램의 설계를 복잡하게 만들기 때문이다.[8]
5. 플랫폼 지원
유닉스 계열 운영 체제와 POSIX 호환 및 부분 호환 운영 체제에서는 시스템 호출이나 ln, link 명령 줄 유틸리티를 사용하여 기존 파일에 대한 하드 링크를 추가로 만들 수 있다.[13] stat
명령어는 지정 파일에 대한 하드 링크 수를 알려주며, ls -l
출력에도 링크 수가 표시된다.
마이크로소프트 윈도우에서는 윈도우 NT 이후 운영 체제(예: 윈도우 비스타)에서 mklink /H
명령어를, 초기 운영 체제 (윈도우 XP, 윈도우 서버 2003)에서 fsutil.exe hardlink create
명령어를 사용하여 하드 링크를 만들 수 있다.[20][21] 윈도우 2000 이상의 윈도우 API는 하드 링크 생성을 위한 `CreateHardLink()` 호출, 제거를 위한 `DeleteFile()`, 연결된 하드 링크 수를 확인하는 `GetFileInformationByHandle()`을 제공한다. 하드 링크는 NTFS 파티션에서만 사용할 수 있다. 윈도우 비스타부터는 DLL의 여러 버전을 추적하기 위해 윈도우 컴포넌트 스토어(WinSxS)에서 하드 링크를 사용한다. 시그윈 등 윈도우에서 실행되는 유닉스 계열 에뮬레이션 또는 호환성 소프트웨어는 윈도우에서 POSIX 인터페이스를 사용할 수 있게 해준다.
윈도우 NT 3.1 이상은 NTFS 파일 시스템에서 하드 링크를 지원한다.[9] 윈도우 2000에서는 `CreateHardLink()` 함수를 도입했지만, 파일에만 사용 가능하고 디렉토리에는 사용할 수 없다.[10] `DeleteFile()` 함수로 하드 링크를 제거할 수 있다.
윈도우에서 하드 링크를 생성하는 방법과 확인하는 방법은 다음과 같다.
생성 방법 | 확인 방법 |
---|---|
윈도우 구성 요소 저장소는 하드 링크를 사용하여 하드 디스크 드라이브에 저장된 다양한 버전의 구성 요소를 추적한다.
유닉스 계열 시스템에서 시스템 호출은 기존 파일에 대한 추가 하드 링크를 생성할 수 있다.
생성 방법 | 확인 방법 |
---|---|
Cygwin 및 UNIX 기반 응용 프로그램용 하위 시스템과 같이 마이크로소프트 윈도우에서 실행되는 유닉스 계열 에뮬레이션 또는 호환성 소프트웨어는 POSIX 인터페이스를 사용할 수 있게 해준다.
OpenVMS는 ODS-5 파일 시스템에서 하드 링크를 지원한다.[15] 유닉스와 달리 VMS는 디렉토리에 대한 하드 링크를 생성할 수 있다.
6. 예시
"LINK A.TXT"와 "LINK B.TXT"라는 두 개의 하드 링크가 동일한 데이터를 가리키는 경우, 한 파일을 수정하면 다른 파일에서도 변경 사항이 반영된다. 예를 들어 텍스트 편집기로 "LINK A.TXT"를 열어 수정하고 저장하면, "LINK B.TXT"를 열었을 때 동일한 변경 사항을 확인할 수 있다. 이는 두 파일 이름이 같은 데이터를 가리키기 때문이다.[16]
그러나 GNU Emacs와 같은 일부 편집기는 이 방식을 따르지 않을 수 있다. Emacs에서 "LINK B.TXT"를 열면, 먼저 "LINK B.TXT"를 "LINK B.TXT~"로 이름을 바꾸고, "LINK B.TXT~"를 편집한 후, 수정된 내용을 새로 만든 "LINK B.TXT"에 저장한다. 이 경우 "LINK A.TXT"와 "LINK B.TXT"는 더 이상 같은 데이터를 공유하지 않게 된다. 이러한 동작은 Emacs 변수 `backup-by-copying`을 사용하여 변경할 수 있다.
UNIX에서는 각 디렉토리가 세 종류의 하드 링크로 참조된다.[17] 예를 들어 tmp 디렉토리는 다음과 같이 참조된다.
종류 | 설명 |
---|---|
부모 디렉토리에서의 이름 | "tmp" |
자신을 가리키는 이름 | "." |
자식 디렉토리에서 부모를 가리키는 이름 | ".." |
7. 비판적 관점
Linux Weekly News의 닐 브라운(Neil Brown)은 하드 링크가 아카이버 및 디스크 사용량 도구와 같이 디렉터리 트리를 처리하는 프로그램의 설계를 복잡하게 만들고, 보존 관리에 많은 노력이 필요하다고 비판했다. 이러한 프로그램들은 계층 구조에서 여러 번 링크된 파일의 중복을 제거해야 한다. 브라운은 유닉스의 후속 제품인 Plan 9 from Bell Labs에는 하드 링크 개념이 포함되어 있지 않다고 지적했다.[8]
참조
[1]
웹사이트
Q & A: The difference between hard and soft links
http://linuxgazette.[...]
[2]
웹사이트
Link Shell Extension
http://schinagl.priv[...]
[3]
웹사이트
Resilient File System (ReFS) overview
https://learn.micros[...]
2022-10-26
[4]
서적
The Design of the UNIX Operating System
https://archive.org/[...]
Prentice Hall
[5]
웹사이트
How Time Machine Works its Magic
http://baligu.com/po[...]
2019-05-19
[6]
웹사이트
Linux kernel source tree, fs/ext4/ext4.h, line 229
https://git.kernel.o[...]
[7]
웹사이트
CreateHardLinkA function (winbase.h)
https://docs.microso[...]
2021-10-13
[8]
웹사이트
Ghosts of Unix past, part 4: High-maintenance designs
https://lwn.net/Arti[...]
2014-04-20
[9]
웹사이트
How hard links work
https://docs.microso[...]
2011-01-06
[10]
웹사이트
CreateHardLink Function
http://msdn.microsof[...]
Microsoft
2011-03-10
[11]
웹사이트
Fsutil hardlink
https://docs.microso[...]
Microsoft
2012-04-18
[12]
웹사이트
Mklink
https://docs.microso[...]
Microsoft
2012-04-18
[13]
웹사이트
New-Item (PowerShell 3.0)
https://docs.microso[...]
Microsoft
2020-06-22
[14]
웹사이트
FileSystemProvider.cs
https://github.com/P[...]
Microsoft
2021-11-20
[15]
웹사이트
OpenVMS System Manager's Manual, Vol. I
https://vmssoftware.[...]
VSI
2021-01-23
[16]
웹사이트
ハードリンクとは - IT用語辞典
https://e-words.jp/w[...]
2024-03-13
[17]
웹사이트
Windowsのシンボリックリンクとジャンクションとハードリンクの違い
https://atmarkit.itm[...]
2024-03-13
[18]
웹인용
Q & A: The difference between hard and soft links
http://linuxgazette.[...]
[19]
웹인용
Link Shell Extension
http://schinagl.priv[...]
[20]
웹인용
NTFS Hard Links, Directory Junctions, and Windows Shortcuts
http://www.flexhex.c[...]
flexhex.com
2017-09-03
[21]
웹인용
How hard links work
http://blogs.technet[...]
[22]
웹인용
Freeware to find and delete hard links
http://www.alldup.in[...]
2017-09-03
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com